package cn.topcodes.tcsf.admin.commons.generic;

import cn.topcodes.tcsf.admin.commons.query.IQueryIdEntityService;
import cn.topcodes.tcsf.admin.commons.domain.IdEntity;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * 单表实体常用操作接口
 *
 * @param <T>
 * @author unicorn
 */
public interface IGenericService<T extends IdEntity> extends IQueryIdEntityService<T> {

    /**
     * 根据ID删除实体
     *
     * @param id 实体ID
     */
    T delete(Long id);

    /**
     * 通过ID数组批量删除
     *
     * @param ids ID数组
     */
    void batchDelete(Long[] ids);

    /**
     * 删除实体
     *
     * @param t 实体对象
     */
    T delete(T t);

    /**
     * 通过实体数组批量删除
     *
     * @param tArr 实体数组
     */
    void batchDelete(T[] tArr);

    /**
     * 通过实体列表批量删除
     *
     * @param list 实体列表
     */
    void batchDelete(List<T> list);

    /**
     * 根据条件删除
     * @param example
     */
    void deleteByExample(Example example);

    /**
     * 删除所有
     */
    void deleteAll();

    /**
     * 通过实体ID将实体标记为删除
     *
     * @param id 实体ID
     */
    void markDelete(Long id);

    /**
     * 标记实体为删除
     *
     * @param t 实体
     */
    void markDelete(T t);

    /**
     * 通过ID数组批量标记为删除
     *
     * @param ids ID数组
     */
    void batchMarkDelete(Long[] ids);

    /**
     * 通过实体列表批量标记删除
     *
     * @param list 实体列表
     */
    void batchMarkDelete(List<T> list);

    /**
     * 通过实体ID将实体标记为禁用
     *
     * @param id 实体ID
     */
    void disable(Long id);

    /**
     * 将实体标记为禁用
     *
     * @param t 实体
     */
    void disable(T t);

    /**
     * 通过实体ID数组批量将实体标记为禁用
     *
     * @param ids 实体ID数组
     */
    void batchDisable(Long[] ids);

    /**
     * 批量禁用实体
     *
     * @param list 实体列表
     */
    void batchDisable(List<T> list);

    /**
     * 通过实体ID将实体标记为启用
     *
     * @param id 实体ID
     */
    void enable(Long id);

    /**
     * 标记实体为启用
     *
     * @param t 实体
     */
    void enable(T t);

    /**
     * 通过实体ID数组批量启用实体
     *
     * @param ids ID数组
     */
    void batchEnable(Long[] ids);

    /**
     * 批量启用实体
     *
     * @param list 实体列表
     */
    void batchEnable(List<T> list);

    /**
     * 更新实体
     *
     * @param t 实体对象
     */
    void update(T t);

    /**
     * 更新实体
     * @param t  实体对象
     * @return  更新后的实体
     */
    T updateBy(T t);

    /**
     * 批量更新实体
     *
     * @param ts 实体数组
     */
    void batchUpdate(T[] ts);

    /**
     * 批量更新实体
     *
     * @param ts 实体列表
     */
    void batchUpdate(List<T> ts);

    /**
     * 插入实体
     *
     * @param t 实体对象
     */
    Long create(T t);

    /**
     * 创建实体
     * @param t 	实体
     * @return	已创建的实体
     */
    public T createBy(T t);

    /**
     * 批量插入实体
     *
     * @param ts 实体数组
     */
    void batchCreate(T[] ts);

    /**
     * 批量插入实体
     *
     * @param ts 实体列表
     */
    void batchCreate(List<T> ts);

    /**
     * 保存实体（创建或更新）
     * @param t    实体
     */
    void save(T t);

    /**
     * 批量保存实体（创建或更新）
     * @param ts    实体列表
     */
    void batchSave(List<T> ts);
}
